package vip.zhenzicheng.algorithm.leetcode.str;

/**
 * <a href="https://leetcode.cn/problems/add-strings/">字符串相加 [简单]</a>
 * <pre>
 *    给定两个字符串形式的非负整数 num1 和num2 ，计算它们的和并同样以字符串形式返回。
 *    你不能使用任何內建的用于处理大整数的库（比如 BigInteger）， 也不能直接将输入的字符串转换为整数形式。
 * 示例 1：
 *    输入：num1 = "11", num2 = "123"
 *    输出："134"
 * 示例 2：
 *    输入：num1 = "456", num2 = "77"
 *    输出："533"
 * 示例 3：
 *    输入：num1 = "0", num2 = "0"
 *    输出："0"
 * 提示：
 *    1 <= num1.length, num2.length <= 104
 *    num1 和num2 都只包含数字 0-9
 *    num1 和num2 都不包含任何前导零
 * </pre>
 *
 * @author zhenzicheng
 * @date 2022-06-12 19:28
 */
public class AddStrings_415 {

  public static void main(String[] args) {
    AddStrings_415 test = new AddStrings_415();
    System.out.println(test.addStrings("99", "9"));
  }

  public String addStrings(String num1, String num2) {
    int n1 = num1.length() - 1, n2 = num2.length() - 1; // 两个数下标索引
    StringBuilder sb = new StringBuilder(); // 结果缓存
    int carry = 0; // 进位信息

    for (int x, y; n1 >= 0 || n2 >= 0 || carry != 0; n1--, n2--) { // 当进位不为0还需要计算
      x = n1 < 0 ? 0 : num1.charAt(n1) - '0'; // 减'0'后代表字符串对应的数字
      y = n2 < 0 ? 0 : num2.charAt(n2) - '0';

      sb.append((x + y + carry) % 10); // 结果是取模后的值
      carry = (x + y + carry >= 10) ? 1 : 0; // 进位信息保存
    }
    return sb.reverse().toString();
  }
}
